home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / os30 / gfx / AGASoftware_23.lha / palettereq / SmPalette.c < prev   
C/C++ Source or Header  |  1993-03-29  |  13KB  |  395 lines

  1. ;/*
  2. sc NODEBUG DATA=FAR NOSTKCHK IGNORE=73 IGNORE=147 UNSCHAR STRMERGE NOLINK SmPalette
  3. slink SmPalette.o ND
  4. quit
  5. */
  6. /*----------------------------------------------------------------------
  7.          This is the Same program as Palette.c, but it compiles to less than
  8.     half it's size.  This ispossible simply by removing any startup code.
  9.     This one also will not put up that annoying little window that SAS/C
  10.     startup code creates when it's programs are started from Workbench.
  11.          Notice the WBStartup code is not quite as stated in the RKM
  12.     manuals, it is based off the code in "HowToCode.txt".
  13.  
  14.         Anyway, you can now change the colors on any screen and use
  15.     the AGA's 24 bit palette.  The only major change over the last
  16.     palette requester I wrote is that it now uses the actual 3.0 functions
  17.     LoadRGB32(), and GetRGB32() rather than my own home brewed versions.
  18.     You will also notice the additions of Keyboard equivalents, and
  19.     "R", "G", and "B" by the sliders, and the addition of a "Selected Color"
  20.     box on the left side of the Palette gadget.
  21.  
  22.         By the way, I am not rich, but I am not doing this for money
  23.     either.  All I ask is if you use or modify this program let me know.
  24.     I am really interested in seeing how far this program gets.
  25.     Do what you want with it.
  26.  
  27.         But if it makes you fell better, I will take cash  :-))
  28.         You can guesse the legal matters, "I am not responsible..."
  29.  
  30.                 Psychotic Psoftware
  31.                 Anthony J. Moringello
  32.                 2209 E. Park Pl. #4
  33.                 Miwlaukee, WI  53211
  34.  
  35. ----------------------------------------------------------------------*/
  36. /*
  37.  *  Source machine generated by GadToolsBox V2.0
  38.  *  which is (c) Copyright 1991-1993 Jaba Development
  39.  *
  40.  *  GUI Designed by : Anthony J. Moringello - anthonym@csd4.csd.uwm.edu
  41.  */
  42.  
  43. #include <exec/types.h>
  44. #include <Exec/Memory.h>
  45. #include <intuition/intuition.h>
  46. #include <Intuition/IntuitionBase.h>
  47. #include <intuition/classes.h>
  48. #include <intuition/classusr.h>
  49. #include <intuition/imageclass.h>
  50. #include <intuition/gadgetclass.h>
  51. #include <libraries/gadtools.h>
  52. #include <DOS/DOSExtens.h>
  53. #include <graphics/displayinfo.h>
  54. #include <graphics/gfxbase.h>
  55. #include <clib/exec_protos.h>
  56. #include <clib/intuition_protos.h>
  57. #include <clib/gadtools_protos.h>
  58. #include <clib/graphics_protos.h>
  59. #include <clib/utility_protos.h>
  60. #include <CLib/DOS_Protos.h>
  61. #include <CLib/AGA_Protos.h>
  62. #include <string.h>
  63.  
  64. #define    ABSEXECBASE ((struct ExecBase **)4L)
  65.  
  66. struct DOSBase    *DOSBase;
  67. struct IntuitionBase    *IntuitionBase;
  68. struct GfxBase    *GfxBase;
  69. struct GadToolsBase    *GadToolsBase;
  70.  
  71. #include <pragmas/exec_pragmas.h>
  72. #include <pragmas/intuition_pragmas.h>
  73. #include <pragmas/gadtools_pragmas.h>
  74. #include <pragmas/graphics_pragmas.h>
  75. #include <pragmas/utility_pragmas.h>
  76. #include <Pragmas/DOS_Pragmas.h>
  77. #include <Pragmas/AGA_Pragmas.h>
  78.  
  79. #include "Palette.h"
  80.  
  81. struct Window         *PReqWnd = NULL;
  82. struct Screen         *Scr = NULL;
  83. struct Gadget         *PReqGList = NULL;
  84. struct IntuiMessage    PReqMsg;
  85. struct Gadget         *PReqGadgets[7];
  86. APTR                   VisualInfo = NULL;
  87. UWORD                  PReqWidth = 300;
  88. UWORD                  PReqHeight = 189;
  89. UBYTE                 *PReqWdt = (UBYTE *)"24 Bit Palette Requester";
  90.  
  91. ULONG  red, green, blue;
  92. ULONG  index, ncolors;
  93. ULONG  table[2+3];
  94. ULONG  *originalpalette;  // Allocate later for depth of screen
  95. int    ResetPalette(void);
  96. int    SetTable(void);
  97.  
  98. struct TextAttr topaz8 = {
  99.     ( STRPTR )"topaz.font", 8, 0x00, 0x01 };
  100.  
  101. UWORD PReqGTypes[] = {
  102.     SLIDER_KIND,
  103.     SLIDER_KIND,
  104.     SLIDER_KIND,
  105.     BUTTON_KIND,
  106.     BUTTON_KIND,
  107.     BUTTON_KIND,
  108.     PALETTE_KIND
  109. };
  110.  
  111. struct NewGadget PReqNGad[] = {
  112.     24, 169, 243, 14, (UBYTE *)"_B", NULL, GD_BlueSliderG, PLACETEXT_LEFT, NULL, (APTR)BlueSliderGClicked,
  113.     24, 152, 243, 14, (UBYTE *)"_G", NULL, GD_GreenSliderG, PLACETEXT_LEFT, NULL, (APTR)GreenSliderGClicked,
  114.     24, 135, 243, 14, (UBYTE *)"_R", NULL, GD_RedSliderG, PLACETEXT_LEFT, NULL, (APTR)RedSliderGClicked,
  115.     2, 97, 86, 32, (UBYTE *)"_Use", NULL, GD_UseG, PLACETEXT_IN, NULL, (APTR)UseGClicked,
  116.     104, 97, 86, 32, (UBYTE *)"r_Eset", NULL, GD_ResetG, PLACETEXT_IN, NULL, (APTR)ResetGClicked,
  117.     203, 97, 86, 32, (UBYTE *)"_Cancel", NULL, GD_CancelG, PLACETEXT_IN, NULL, (APTR)CancelGClicked,
  118.     51, 3, 238, 90, NULL, NULL, GD_PaletteG, 0, NULL, (APTR)PaletteGClicked
  119. };
  120.  
  121. ULONG PReqGTags[] = {
  122.     (GTSL_Max), 255, (GTSL_MaxLevelLen), 3, (GTSL_LevelFormat), (ULONG)"%2lX", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
  123.     (GTSL_Max), 255, (GTSL_MaxLevelLen), 3, (GTSL_LevelFormat), (ULONG)"%2lX", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
  124.     (GTSL_Max), 255, (GTSL_MaxLevelLen), 3, (GTSL_LevelFormat), (ULONG)"%2lX", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
  125.     (GT_Underscore), '_', (TAG_DONE),
  126.     (GT_Underscore), '_', (TAG_DONE),
  127.     (GT_Underscore), '_', (TAG_DONE),
  128.     (GTPA_Depth), 8, (TAG_DONE)
  129. };
  130.  
  131. /*------------------------------------------------------------------------
  132.  *    Notice I must put my main function first so that it is the first
  133.  *  to be executed when started.  Does not have to be named main().
  134.  */
  135. __asm SmPalette(void)
  136. {
  137.     BOOL  running = TRUE;
  138.     struct Process    *proc;
  139.     struct Message *WBMsg = NULL;
  140.  
  141.     proc = (struct Process *)FindTask(NULL); // Who/Where am I?
  142.     if( !proc->pr_CLI )        // Am I started from a CLI?
  143.     {
  144.         WaitPort(&proc->pr_MsgPort);    // NO? Well then get WBStartup Msg.
  145.         WBMsg = GetMsg(&proc->pr_MsgPort);
  146.     }
  147.  
  148.     DOSBase=(struct DOSBase *)OpenLibrary("dos.library", 0);
  149.     if( DOSBase )    // No startup code, get DOSBase my self
  150.     {
  151.         IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37);
  152.         if( IntuitionBase )
  153.         {
  154.             GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 39);
  155.             if( GfxBase )
  156.             {
  157.                 GadToolsBase = (struct GadToolsBase *)OpenLibrary("gadtools.library", 37);
  158.                 if( GadToolsBase )
  159.                 {
  160.                     Scr = IntuitionBase->FirstScreen;
  161.                     if( (VisualInfo = GetVisualInfo( Scr, TAG_DONE)) )
  162.                     {
  163.                         ncolors = 1<< Scr->BitMap.Depth;
  164.                         PReqGTags[61] = Scr->BitMap.Depth;
  165.                             OpenPReqWindow();
  166.                             if( PReqWnd )
  167.                             {
  168.                                 originalpalette = AllocVec(8+ 12*ncolors, MEMF_ANY|MEMF_CLEAR);
  169.                                 if( originalpalette ) // Store original screen colors.
  170.                                 {
  171.                                 GetRGB32(Scr->ViewPort.ColorMap, 0, ncolors, &originalpalette[1]);
  172.                                 originalpalette[0] = ncolors<<16 + 0; // Set up color table
  173.                                       ResetPalette(); // Basically just set up sliders.
  174.                                     while( running )
  175.                                     {
  176.                                           Wait(1L<<PReqWnd->UserPort->mp_SigBit);
  177.                                         running = HandlePReqIDCMP();
  178.                                     }
  179.                                }
  180.                                 FreeVec(originalpalette);
  181.                                 ClosePReqWindow();
  182.                            }
  183.                         FreeVisualInfo( VisualInfo );
  184.                         VisualInfo = NULL;
  185.                     }
  186.                        CloseLibrary((struct Library *)GadToolsBase);
  187.                    }
  188.                   CloseLibrary((struct Library *)GfxBase);
  189.               }
  190.              CloseLibrary((struct Library *)IntuitionBase);
  191.          }
  192.          CloseLibrary((struct Library *)DOSBase);
  193.     }
  194.  
  195.     if( WBMsg )    // Hey! We were started from WB, clean up.
  196.     {
  197.           Forbid();
  198.           ReplyMsg(WBMsg);
  199.           Permit();
  200.      }
  201.  
  202.     return(0);    // Remember to exit from Main or program will continue...
  203. }
  204.  
  205. #include "Palette_Temp.c"
  206.  
  207. /*-------------------------------------------------------------------------
  208.  * Reset palette from original colors, and put sliders in the correct place.
  209.  */
  210. int
  211. ResetPalette(void)
  212. {
  213.     LoadRGB32(&Scr->ViewPort, originalpalette);
  214.     GetRGB32(Scr->ViewPort.ColorMap, index, 1, &table[1]);
  215.     red   = table[1]>>24;
  216.     green = table[2]>>24;
  217.     blue  = table[3]>>24;
  218.     SetAPen(PReqWnd->RPort, index);
  219.     RectFill(PReqWnd->RPort, PReqWnd->BorderLeft+9, PReqWnd->BorderTop+29,
  220.                                  PReqWnd->BorderLeft+41, PReqWnd->BorderTop+61);
  221.      GT_SetGadgetAttrs(PReqGadgets[2], PReqWnd, NULL,
  222.                        GTSL_Level, red, TAG_END);
  223.      GT_SetGadgetAttrs(PReqGadgets[1], PReqWnd, NULL,
  224.                        GTSL_Level, green, TAG_END);
  225.      GT_SetGadgetAttrs(PReqGadgets[0], PReqWnd, NULL,
  226.                        GTSL_Level, blue, TAG_END);
  227.     return(0);
  228. }
  229.  
  230. /*-----------------------------------
  231.  *  Draw that little color-select box
  232.  */
  233. void PReqRender( void )
  234. {
  235.     UWORD        offx, offy;
  236.  
  237.     offx = PReqWnd->BorderLeft;
  238.     offy = PReqWnd->BorderTop;
  239.  
  240.  
  241.     DrawBevelBox( PReqWnd->RPort, offx + 3, offy + 26, 45, 39, GT_VisualInfo, VisualInfo, TAG_DONE );
  242.     DrawBevelBox( PReqWnd->RPort, offx + 7, offy + 28, 37, 35, GT_VisualInfo, VisualInfo, GTBB_Recessed, TRUE, TAG_DONE );
  243. }
  244.  
  245. /*------------------------------
  246.  *  Act on gadget/key presses
  247.  */
  248. int HandlePReqIDCMP( void )
  249. {
  250.     struct IntuiMessage    *m;
  251.     int            (*func)(struct IntuiMessage *);
  252.     BOOL            running = TRUE;
  253.  
  254.     while( m = GT_GetIMsg( PReqWnd->UserPort )) {
  255.  
  256.         CopyMem(( char * )m, ( char * )&PReqMsg, (long)sizeof( struct IntuiMessage ));
  257.         GT_ReplyIMsg( m );
  258.         switch ( PReqMsg.Class )
  259.         {
  260.             case    IDCMP_REFRESHWINDOW:
  261.                 GT_BeginRefresh( PReqWnd );
  262.                 PReqRender();
  263.                 GT_EndRefresh( PReqWnd, TRUE );
  264.                 break;
  265.  
  266.             case    IDCMP_CLOSEWINDOW:
  267.                 running = PReqCloseWindow();
  268.                 break;
  269.  
  270.             case    IDCMP_VANILLAKEY: // Must handle key equivalents manualy
  271.                 switch(PReqMsg.Code)
  272.                 {
  273.                     case 'u':
  274.                     case 'U':
  275.                         running = FALSE;
  276.                         break;
  277.                     case 'e':
  278.                     case 'E':
  279.                               ResetPalette();
  280.                         running = TRUE;
  281.                         break;
  282.                     case 'c':
  283.                     case 'C':
  284.                         ResetPalette();
  285.                         running = FALSE;
  286.                         break;
  287.                     case 'r':        // Move foward.
  288.                         red = (++red)&0xFF;
  289.                         GT_SetGadgetAttrs(PReqGadgets[2], PReqWnd, NULL, GTSL_Level, red, TAG_END);
  290.                               SetTable();
  291.                               break;
  292.                          case 'R':        // Move backwards.
  293.                              red = (--red)&0xFF;
  294.                              GT_SetGadgetAttrs(PReqGadgets[2], PReqWnd, NULL, GTSL_Level, red, TAG_END);
  295.                              SetTable();
  296.                              break;
  297.                     case 'g':
  298.                         green = (++green)&0xFF;
  299.                         GT_SetGadgetAttrs(PReqGadgets[1], PReqWnd, NULL, GTSL_Level, green, TAG_END);
  300.                               SetTable();
  301.                               break;
  302.                          case 'G':
  303.                              green = (--green)&0xFF;
  304.                              GT_SetGadgetAttrs(PReqGadgets[1], PReqWnd, NULL, GTSL_Level, green, TAG_END);
  305.                              SetTable();
  306.                              break;
  307.                     case 'b':
  308.                         blue = (++blue)&0xFF;
  309.                         GT_SetGadgetAttrs(PReqGadgets[0], PReqWnd, NULL, GTSL_Level, blue, TAG_END);
  310.                               SetTable();
  311.                               break;
  312.                          case 'B':
  313.                              blue = (--blue)&0xFF;
  314.                              GT_SetGadgetAttrs(PReqGadgets[0], PReqWnd, NULL, GTSL_Level, blue, TAG_END);
  315.                              SetTable();
  316.                              break;
  317.  
  318.                          default:
  319.                              break;
  320.                     }
  321.                     break;
  322.  
  323.             case IDCMP_MOUSEMOVE:
  324.             case    IDCMP_GADGETUP:
  325.             case    IDCMP_GADGETDOWN:
  326.                 func = ( void * )(( struct Gadget * )PReqMsg.IAddress )->UserData;
  327.                 running = func(&PReqMsg);
  328.                 break;
  329.         }
  330.     }
  331.     return( running );
  332. }
  333.  
  334. int OpenPReqWindow( void )
  335. {
  336.     struct NewGadget    ng;
  337.     struct Gadget    *g;
  338.     UWORD        lc, tc;
  339.     UWORD        offx = Scr->WBorLeft, offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;
  340.  
  341.     if ( ! ( g = CreateContext( &PReqGList )))
  342.         return( 1L );
  343.  
  344.     for( lc = 0, tc = 0; lc < PReq_CNT; lc++ ) {
  345.  
  346.         CopyMem((char * )&PReqNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  347.  
  348.         ng.ng_VisualInfo = VisualInfo;
  349.         ng.ng_TextAttr   = &topaz8;
  350.         ng.ng_LeftEdge  += offx;
  351.         ng.ng_TopEdge   += offy;
  352.  
  353.         PReqGadgets[ lc ] = g = CreateGadgetA((ULONG)PReqGTypes[ lc ], g, &ng, ( struct TagItem * )&PReqGTags[ tc ] );
  354.  
  355.         while( PReqGTags[ tc ] ) tc += 2;
  356.         tc++;
  357.  
  358.         if ( NOT g )
  359.             return( 2L );
  360.     }
  361.  
  362.     if ( ! ( PReqWnd = OpenWindowTags( NULL,
  363.                 WA_Left,    0,
  364.                 WA_Top,        0,
  365.                 WA_Width,    PReqWidth,
  366.                 WA_Height,    PReqHeight + offy,
  367.                 WA_IDCMP,    SLIDERIDCMP|BUTTONIDCMP|PALETTEIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_MOUSEMOVE|IDCMP_VANILLAKEY,
  368.                 WA_Flags,    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE|WFLG_RMBTRAP,
  369.                 WA_Gadgets,    PReqGList,
  370.                 WA_Title,    PReqWdt,
  371.                 WA_ScreenTitle,    "24 Bit Palette Requester © Anthony J. Moringello",
  372.                 WA_PubScreen,    Scr,
  373.                 TAG_DONE )))
  374.     return( 4L );
  375.  
  376.     GT_RefreshWindow( PReqWnd, NULL );
  377.  
  378.     PReqRender();
  379.  
  380.     return( 0L );
  381. }
  382.  
  383. void ClosePReqWindow( void )
  384. {
  385.     if ( PReqWnd        ) {
  386.         CloseWindow( PReqWnd );
  387.         PReqWnd = NULL;
  388.     }
  389.  
  390.     if ( PReqGList      ) {
  391.         FreeGadgets( PReqGList );
  392.         PReqGList = NULL;
  393.     }
  394. }
  395.